#include "IntersectorListas.h"
#include <algorithm>
#include <iostream>


IntersectorListas::IntersectorListas() : cantElementos(0)
{
}

IntersectorListas::~IntersectorListas() {
	this->matrizListas.clear();
}


void IntersectorListas::addLista(std::vector<unsigned int> vecLista){
	// Cuenta la cantidad de elemtos que tiene la lista
	if (vecLista.size() > this->cantElementos) this->cantElementos = vecLista.size();

	this->matrizListas.push_back(vecLista);
}


std::vector<unsigned int> IntersectorListas::getInterseccion(){

	while (this->matrizListas.size() >1){
		// Extrae las dos listas del frente
		std::vector<unsigned int> vec1 = this->matrizListas.front();
		this->matrizListas.pop_front();

		std::vector<unsigned int> vec2 = this->matrizListas.front();
		this->matrizListas.pop_front();

		// Realiza la interseccion de dos listas
		std::vector<unsigned int> vecResul(this->cantElementos+1, 0);
		std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vecResul.begin());

		// Guarda el resultado en la matriz principal
		this->matrizListas.push_back(vecResul);
	}

	// En este punto solo queda un elemento en la matriz de listas y es la interseccion de todas las listas

	// Lo limpiamos de los ceros que pudieron sobrar de la interseccion
	std::vector<unsigned int>::iterator itBeg = this->matrizListas.front().begin();
	std::vector<unsigned int>::iterator itEnd = this->matrizListas.front().end();
	std::vector<unsigned int>::iterator it = std::find(itBeg, itEnd , 0);
	this->matrizListas.front().erase(it, itEnd);

	// Se devuelve el vector con la interseccion de los valores
	return this->matrizListas.front();
}
